unit FPresupuestos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, XDBGrids, StdCtrls, DBCtrls, Buttons, ExtCtrls, DB,
  DBGrids, ZAbstractRODataset;

type
  TFormPresupuestos = class(TForm)
    Label1: TLabel;
    pBotones: TPanel;
    BtnSalir: TSpeedButton;
    BtnNuevo: TSpeedButton;
    BtnModificar: TSpeedButton;
    BtnEliminar: TSpeedButton;
    Label3: TLabel;
    DBNavigator1: TDBNavigator;
    cbBuscar: TComboBox;
    eBuscar: TEdit;
    Grid: TXDBGrid;
    dsPresup_List: TDataSource;
    BtnImprimirPresup: TSpeedButton;
    BtnImp_Orden_Trab: TSpeedButton;
    BtnDuplicar: TSpeedButton;
    procedure FormShow(Sender: TObject);
    procedure BtnSalirClick(Sender: TObject);
    procedure GridTitleClick(Column: TXColumn);
    procedure BtnNuevoClick(Sender: TObject);
    procedure BtnModificarClick(Sender: TObject);
    procedure BtnImprimirPresupClick(Sender: TObject);
    procedure BtnEliminarClick(Sender: TObject);
    procedure GridPaintColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TXColumn; Highlight: Boolean;
      Selections: TSelections; var Color: TColor; Font: TFont;
      var Image: TPersistent);
    procedure eBuscarKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure BtnImp_Orden_TrabClick(Sender: TObject);
    procedure dsPresup_ListDataChange(Sender: TObject; Field: TField);
    procedure BtnDuplicarClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Procedure RefrescaLista;
  public
    { Public declarations }
  end;

var
  FormPresupuestos: TFormPresupuestos;

implementation

uses
  FMain,
  FPresupuestosEdit,
  modDatos, StrUtils;

{$R *.dfm}

procedure TFormPresupuestos.FormShow(Sender: TObject);
var
  Key: Word;
  I: integer;
  StrSQL   : String;
begin
  Left  := 0;
  Top   := FormMain.Height;
  Width := Screen.Width;
  Height:= Screen.WorkAreaHeight - Top;
  Key := 0;
  if not md.qPresup_List.Active then
    eBuscarKeyUp( Sender, Key, []);
  //md.qPresup_List.Open;

  //Preparar buscador
  cbBuscar.Items.Clear;
  for i := 0 to Grid.Columns.Count - 1 do
  begin
    cbBuscar.Items.Add( Grid.Columns[ i].Title.Caption);
    if pos( 'USUARIO', Grid.Columns[ i].FieldName) > 0 then
    begin
      StrSQL := 'SELECT * ' +
                'FROM USUARIOS ';
      MD.AbreQuery( md.Query, StrSQL);
      While not md.Query.Eof do
      begin
        Grid.Columns[ i].PickList.Add( md.Query.FieldByName( 'ID_USUARIO').AsString);
        Grid.Columns[ i].PickText.Add( md.Query.FieldByName( 'NOMBRE').AsString);
        md.Query.Next;
      end;
      MD.Query.Close;
    end;
    if pos( 'ESTADO', Grid.Columns[ i].FieldName) > 0 then
    begin
      StrSQL := 'SELECT * ' +
                'FROM PRESUP_ESTADO ';
      MD.AbreQuery( MD.Query, StrSQL);
      While not md.Query.Eof do
      begin
        Grid.Columns[ i].PickList.Add( md.Query.FieldByName( 'ID_PRESUP_ESTADO').AsString);
        Grid.Columns[ i].PickText.Add( md.Query.FieldByName( 'DESCRIPCION_ESTADO').AsString);
        md.Query.Next;
      end;
      MD.Query.Close;
    end;
  end;
  cbBuscar.ItemIndex := cbBuscar.Items.IndexOf( Grid.ColumnByName( 'NOMBRE_CLIENTE').Title.Caption);
end;

procedure TFormPresupuestos.BtnSalirClick(Sender: TObject);
begin
  md.TPresupuestos.Close;
  Close;
end;

procedure TFormPresupuestos.GridTitleClick(Column: TXColumn);
begin
  MD.qPresup_List.SortedFields := Grid.OrderFields;
end;

procedure TFormPresupuestos.BtnNuevoClick(Sender: TObject);
begin
  With TFormPresupuestosEdit.Create( Self) do
    try
      md.TPresupuestos.Open;
      md.TPresupuestos.Append;
      MD.TPresupuestos.FieldByName( 'ID_USUARIO_CREACION').AsInteger:= Id_Usuario;
      md.TPresupuestos.FieldByName( 'FECHA_CREACION').AsDateTime    := Now;
      Nuevo := True;
      ShowModal;
    finally
      Free;
      md.TPresupuestos.Close;
      RefrescaLista;
      md.qPresup_List.First;
    end;
end;

procedure TFormPresupuestos.BtnModificarClick(Sender: TObject);
begin
  if not md.qPresup_List.IsEmpty then
    With TFormPresupuestosEdit.Create( Self) do
      try
        md.TPresupuestos.Open;
        md.TPresupuestos.Locate( 'ID_PRESUP', md.qPresup_List.FieldByName( 'ID_PRESUP').Value, []);
        md.TPresupuestos.Edit;
        ShowModal;
      finally
        Free;
        md.TPresupuestos.Close;
        RefrescaLista;
      end;
end;

procedure TFormPresupuestos.BtnImprimirPresupClick(Sender: TObject);
begin
  md.Imprimir_Presupuesto( md.qPresup_List.FieldByName( 'ID_PRESUP').AsString);
end;


procedure TFormPresupuestos.BtnImp_Orden_TrabClick(Sender: TObject);
begin
  if not md.qPresup_List.IsEmpty then
    md.Imprimir_Orden_Trabajo( md.qPresup_List.FieldByName( 'ID_PRESUP').AsString);
end;


procedure TFormPresupuestos.BtnEliminarClick(Sender: TObject);
var
  StrSQL: String;
begin
  if MessageDlg( 'Seguro que quieres eliminar el Presupuesto?', mtConfirmation, [ mbYes, mbNo], 0) = mrYes then
  begin
    StrSQL := 'DELETE FROM PRESUPUESTOS ' +
              'WHERE ID_PRESUP = ' + md.qPresup_List.FieldByName( 'ID_PRESUP').AsString;
    md.Ejecuta( StrSQL);
    RefrescaLista;
  end;
end;

procedure TFormPresupuestos.RefrescaLista;
var
  No    : Integer;
begin
  No     := md.qPresup_List.RecNo;
  md.qPresup_List.Close;
  md.qPresup_List.Open;
  md.qPresup_List.RecNo := No;
end;

procedure TFormPresupuestos.GridPaintColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TXColumn;
  Highlight: Boolean; Selections: TSelections; var Color: TColor;
  Font: TFont; var Image: TPersistent);
begin
  if (slCellSelected in Selections) or (slCellFixed in Selections) then Exit
  else
    //Cada Registro le damos un color diferente
    if slMultiSelected in Selections then //Color := $00F08000
      if Odd( TXDBGrid( Sender).DataSource.DataSet.RecNo) then Color := $0AF0047
                                                          else Color := $0FF0000
    else
      //Cada Registro le damos un color diferente
      if Odd( TXDBGrid( Sender).DataSource.DataSet.RecNo) then Color := $0E7FFFF
                                                          else Color := $0C7FFFF
end;

procedure TFormPresupuestos.eBuscarKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i     : Integer;
  StrSQL: String;
begin
  i := 0;
  StrSQL := '';
  While ( i < Grid.Columns.Count) and ( StrSQL = '') do
  begin
    if Grid.Columns[ i].Title.Caption = cbBuscar.Text then
      if Grid.Columns[ i].FieldName = 'NOMBRE_CLIENTE' then
        StrSQL := 'C.NOMBRE '
      else if Grid.Columns[ i].FieldName = 'NOMBRE' then
        StrSQL := 'U.NOMBRE '
      else
        StrSQL := Grid.Columns[ i].FieldName
    else
      i := i + 1;
  end;
  if eBuscar.Text = '' then StrSQL := ''
                       else StrSQL := 'WHERE ' + StrSQL + ' LIKE ' + QuotedStr( '%' + eBuscar.Text + '%') + ' ';
  if Permisos < 2 then
  begin
    if StrSQL = '' then StrSQL := 'WHERE '
                   else StrSQL := StrSQL + 'AND ';
    StrSQL := StrSQL + 'ID_USUARIO_CREACION = ' + IntToStr( Id_Usuario) + ' ';
  end;
  StrSQL := 'SELECT P.ID_PRESUP, P.FECHA_CREACION, U.NOMBRE, PE.DESCRIPCION_ESTADO, C.ID_CLIENTE, C.NOMBRE NOMBRE_CLIENTE, P.CONCEPTO, FAB_CANTIDAD ' +
            'FROM PRESUPUESTOS P ' +
              'INNER JOIN USUARIOS U ON U.ID_USUARIO = P.ID_USUARIO_CREACION ' +
              'INNER JOIN PRESUP_ESTADO PE ON PE.ID_PRESUP_ESTADO = P.ESTADO ' +
              'LEFT  JOIN CLIENTES C ON C.ID_CLIENTE = P.ID_CLIENTE ' +
            StrSQL +
            'ORDER BY ID_PRESUP DESC ';
  md.AbreQuery( md.qPresup_list, StrSQL);
end;

procedure TFormPresupuestos.dsPresup_ListDataChange(Sender: TObject; Field: TField);
begin
  BtnImp_Orden_Trab.Enabled := ( md.qPresup_List.FieldByName( 'FAB_CANTIDAD').AsInteger > 0);
end;

procedure TFormPresupuestos.BtnDuplicarClick(Sender: TObject);
var
  Viejo_id,
  Nuevo_id,
  Campos  ,
  Valores ,
  StrSQLEx,
  StrSQL  : String;

  Procedure Copiar_Registro( Tabla: String; Consigue_ID: Boolean = False);
  begin
    Campos  := '';
    Valores := '';
    StrSQL  := 'SHOW COLUMNS FROM ' + Tabla;
    md.AbreQuery( md.Query, StrSQL);
    While not md.Query.Eof do
    begin
      //El campo ID no se copia, porque si existe es siempre autoinvremental
      if ( md.Query.Fields[ 0].AsString = 'ID') or
         ( Consigue_ID and ( md.Query.Fields[ 0].AsString = 'ID_PRESUP')) then
      //No se hace nada
      else
        begin
          //El campo de ID_PRESUP, para el caso de que sean los valores, entonces se pone el valor directamente
          if md.Query.Fields[ 0].AsString = 'ID_PRESUP' then Valores := Valores + ', ' +  Nuevo_ID
                                                        else Valores := Valores + ', ' +  md.Query.Fields[ 0].AsString;
          Campos := Campos + ', ' +  md.Query.Fields[ 0].AsString;
        end;
      md.Query.Next;
    end;
    Valores := RightStr( Valores, Length( Valores) - 2);
    CampoS  := RightStr( Campos , Length( Campos)  - 2);

    StrSQLEx := StrSQLEx +
                'INSERT INTO ' + Tabla + '( ' + Campos + ') ' +
                '( SELECT ' + Valores + ' FROM ' + Tabla + ' WHERE ID_PRESUP = ' + Viejo_ID + '); ';

    if Consigue_ID then
    begin
      Md.Ejecuta( StrSQLEx);
      StrSQL := 'SELECT MAX( ID_PRESUP) ' +
                'FROM PRESUPUESTOS ';
      md.AbreQuery( md.Query, StrSQL);
      Nuevo_Id := md.Query.Fields[ 0].AsString;
      StrSQLEx := '';
    end;
  end;
begin
  StrSQLEx := '';
  Viejo_ID := md.qPresup_List.FieldByName( 'ID_PRESUP').AsString;
  Copiar_Registro( 'PRESUPUESTOS', True);
  Copiar_Registro( 'PRESUP_FOTOCOMPOSICION');
  Copiar_Registro( 'PRESUP_ITEM_EXTRA');
  Copiar_Registro( 'PRESUP_NUMERACION');
  Copiar_Registro( 'PRESUP_TALONARIOS_ACABADO');
  Copiar_Registro( 'PRESUP_TALONARIOS_JUEGOS');
  Copiar_Registro( 'PRESUP_TANTOS');
  Copiar_Registro( 'PRESUP_TANTOS_COLORES');
  Md.Ejecuta( StrSQLEx);
  StrSQL := 'UPDATE PRESUPUESTOS ' +
            'SET FECHA_CREACION = NOW(), ID_USUARIO_CREACION = ' + IntToStr( Id_Usuario) + ', FECHA_ULT_MODIF = NULL, ID_USUARIO_ULT_MODIF = NULL, ESTADO = 1, FAB_CANTIDAD = 0 ' +
            'WHERE ID_PRESUP = ' + Nuevo_ID;
  Md.Ejecuta( StrSQL);

  MD.RefrescaTabla( MD.qPresup_List);
end;

procedure TFormPresupuestos.FormCreate(Sender: TObject);
begin
  dsPresup_List.DataSet := md.qPresup_List;
end;

end.
